﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DataTier.Entities;
using DataTier.Helpers;

namespace DataTier.Repository
{
    /// <summary>
    /// Репозиторий для аутентификации/авторизации
    /// </summary>
    public class AuthRepository : RepositoryBase
    {
        public AuthRepository()
        {

        }

        public AuthRepository(IDbConnection connection)
            : base(connection)
        {

        }

        /// <summary>
        /// Возвращает полную информацию о пользователе и его правах доступа
        /// </summary>
        /// <param name="DomainLoginName"></param>
        /// <returns></returns>
        public UserSecurityDetails GetUserSecurityDetails(string DomainLoginName, string hashPassword)
        {
            using (var dbcontext = CreateDataContext())
            {
                var user = dbcontext.User
                    // Подключаются таблицы с информацией о вхождении пользователя в центр застрат, отдел, департамент, юр.лицо, компанию
                    .Include("CostsCenter")
                    .Include("CostsCenter.Department")
                    .Include("CostsCenter.Department.JuridicalPerson")
                    .Include("CostsCenter.Department.JuridicalPerson.Company")

                    // Подключаются таблицы с информацией о роли и правах пользователя
                    .Include("Role")
                    .Include("Role.Permission")
                    .Include("Role.Permission.PermissionCategory")
                    .Include("Role.Permission.Menu")
                    .Include("Role.Permission.State")
                    .Include("Role.Permission.WebPage")

                    .Where(u => u.Login.ToLower() == DomainLoginName.ToLower() &&
                                //string.IsNullOrEmpty(hashPassword) ? (u.PassHash.Equals(null) || u.PassHash == "") : u.PassHash == hashPassword && // Данный вариант почему-то не срабатывал. Неясно почему
                                (string.IsNullOrEmpty(hashPassword) ? string.IsNullOrEmpty(u.PassHash) : u.PassHash == hashPassword) && 
                                u.Deleted != true).FirstOrDefault();

                return EntityHelper.GetUserSecurityDetails(user);
            }
        }


        /// <summary>
        /// Проводит аутентификацию пользователя
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="hashPassword"></param>
        /// <returns>1-ok, 2-заблокирован, 0 - не верный логин/пароль</returns>
        public int AuthenticateUser(string userName, string hashPassword)
        {
            using (var dbcontext = CreateDataContext())
            {
                var user = dbcontext.User
                    .Where(
                            u => u.Deleted != true && 
                                u.Login.ToLower() == userName.ToLower() &&
                                string.IsNullOrEmpty(hashPassword) ? (u.PassHash.Equals(null) || u.PassHash =="") : u.PassHash == hashPassword)
                    .FirstOrDefault();

                if (user == null)
                    return 0;

                if (!user.IsEnable)
                    return 2;

                return 1;
            }
        }

    }
}
